let handlers = Symbol('handlers')

function makeObservable(target) {
	// 1. 初始化 handler 存储
	target[handlers] = []

	// 将 handler 函数存储到数组中，以便于之后调用
	target.observe = function (handler) {
		this[handlers].push(handler)
	}

	// 2. 创建一个 proxy 代理对象，以处理更改
	return new Proxy(target, {
		set(target, key, value, receiver) {
			let success = Reflect.set(...arguments) // 写入成功返回 true
			if (success) {
				// 调用所有的 handler
				target[handlers].forEach((handler) => handler(key, value))
			}
			return success
		},
	})
}

// *****************************************************************************************************

let user = {}
user = makeObservable(user)

user.observe((key, value) => {
	console.log(`SET ${key}=${value}`)
})

user.name = 'John' // SET name=John
